#pragma once

namespace PugixmlTest
{
    /** Document Object Model
     * 树的根是文档本身，它对应于C++中的 xml_document 类型。
     * 文档有一个或多个子节点，这些子节点对应于C++中的 xml_node 类型。
     * 
     * 节点有不同的类型；根据节点的类型，它可以拥有一个子节点集合、一个属性集合（对应于C++中的 xml_attribute 类型），以及一些额外的数据（例如名称）。
     * 文档节点（node_document）——这是树的根节点，由若干子节点组成。
     *      该节点对应于 xml_document 类；需要注意的是，xml_document 是 xml_node 的子类，因此整个节点接口也是可用的。
     * 元素/标签节点（node_element）——这是最常见的节点类型，用于表示 XML 元素。
     *      元素节点具有名称、属性集合和子节点集合（这两者都可能是空的）。属性是一个简单的名称/值对。
     * 普通字符数据节点（node_pcdata）用于表示 XML 中的普通文本。
     *      PCDATA 节点具有值，但没有名称或子节点/属性。需要注意的是，普通字符数据不是元素节点的一部分，
     *      而是有自己的节点；例如，一个元素节点可以有多个子 PCDATA 节点。
     * 尽管存在多种节点类型，但只有三种 C++ 类型用于表示树（xml_document、xml_node、xml_attribute）；
     *      某些对 xml_node 的操作仅适用于特定的节点类型。这些操作将在下文中描述。
     * 
     * xml_document 是整个文档结构的所有者；销毁文档会销毁整个树结构。xml_document 的接口包括加载函数、保存函数以及 xml_node 的完整接口，这些接口允许对文档进行检查和/或修改。
     *      需要注意的是，尽管 xml_document 是 xml_node 的子类，但 xml_node 并不是一个多态类型；继承的存在只是为了简化使用。
     * xml_node 是文档节点的句柄；
     *      它可以指向文档中的任何节点，包括文档本身。所有类型的节点都有一个通用接口。
     *      需要注意的是，xml_node 只是实际节点的句柄，而不是节点本身——你可以有多个 xml_node 句柄指向同一个底层对象。
     *      销毁 xml_node 句柄不会销毁节点，也不会将其从树中移除。
     * xml_node 类型有一个特殊的值，称为空节点或空值节点。它不对应于任何文档中的任何节点，因此类似于空指针。
     *      然而，所有操作都在空节点上定义了；通常这些操作不会执行任何操作，并将返回空节点/属性或空字符串作为其结果。
     *      这对于链式调用非常有用；例如，你可以像这样获取一个节点的祖父节点：node.parent().parent()；
     *      如果一个节点是空节点，或者它没有父节点，第一个 parent() 调用将返回空节点；
     *      然后第二个 parent() 调用也会返回空节点，因此你不需要进行两次错误检查。
     *      你可以通过隐式的布尔类型转换来测试一个句柄是否为空：if (node) { …​ } 或 if (!node) { …​ }。
     * xml_attribute 是 XML 属性的句柄；
     *      它与 xml_node 具有相同的语义，即可以有多个 xml_attribute 句柄指向同一个底层对象，
     *      并且存在一个特殊的空属性值，该值会传播到函数的结果中。
     * 在配置 pugixml 时，可以选择两种接口和内部表示形式：你可以选择 UTF-8（也称为 char）接口，或者 UTF-16/32（也称为 wchar_t）接口。
     *      这种选择通过 PUGIXML_WCHAR_MODE 宏定义控制；你可以通过 pugiconfig.hpp 文件或预处理器选项来设置它。
     *      所有处理字符串的树函数都可以处理选定字符类型的 C 风格空终止字符串或 STL 字符串。关于 Unicode 接口的更多信息，请参阅手册。
     * 
     */
} // namespace PugixmlTest
